之前有提起,在Ruby的世界裡Block不是物件,
也不能單獨使用,但藉由將Block物件化後,
Blcok就可以單獨存在了,
藉由Proc或Lambda可以將Block物件化。
使用Proc類別,
先藉由Proc.new變成物件形式,
再指定成變數的形式,
利用call方法呼叫,
即可以使用Blcok內的程式。
例如:
Block為 { |num| num * 3},
那我們藉由Proc.new
會變成 Proc.new { |num| num * 3},
再用指定變數的形式,
會變成triple_proc = Proc.new { |num| num * 3},
利用call方法叫出,
triple_proc.call(5),
即會得到15。
其實呼叫方法的方式,
不只使用Call才能呼叫,
還有其他的方式可以呼叫方法,
例如:
triple_proc[5]
triple_proc.(5)
triple_proc === 5
triple_proc.yield 5
另外這四種方法,
都可以把剛剛物件化的Block呼叫出來。
其實 Proc.new 就是等於lambda的概念,
Proc.new = lambda,
所以將剛剛指定變數的部分改成triple_lambda = lambda { |num| num * 3},
就可以向剛剛一樣用call呼叫我們藉由lambda做變數指定的物件化來使用。
其實這兩者之間是相同的,
而唯一的差別在於,
當如果帶入多個引數時,
Proc.nw會使用第一個引數,並正常運行,
但lambda會跳出錯誤訊息,告訴你引數錯誤。
例如:
triple_proc.call(3,4,5) 會得到9
triple_lambda.call(3,4,5) 就會得到錯誤訊息
不能單獨存在的Block,
除了之前介紹使用yield,
可以讓Block運行外,
也可以藉由Proc.new或lambda將他們定義成一個變數,
在用變數內call方法來使用。